package maple.thelittleredbook.content.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import maple.thelittleredbook.content.entity.Content;
import maple.thelittleredbook.content.dto.ContentListItemDTO;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 内容Mapper接口
 */
@Mapper
public interface ContentMapper extends BaseMapper<Content> {

    /**
     * 分页查询用户自己的内容列表
     * 对应XML文件中的selectUserContentList
     *
     * @param page 分页参数
     * @param userId 用户ID
     * @param title 标题筛选（模糊匹配），可选
     * @param textContent 内容筛选（模糊匹配），可选
     * @param contentType 内容类型筛选，可选
     * @param orderBy 排序方式（created_at 或 like_count）
     * @return 分页内容列表
     */
    IPage<ContentListItemDTO> selectUserContentList(Page<ContentListItemDTO> page,
                                                    @Param("userId") Long userId,
                                                    @Param("title") String title,
                                                    @Param("textContent") String textContent,
                                                    @Param("contentType") String contentType,
                                                    @Param("orderBy") String orderBy);

    /**
     * 分页查询所有内容列表（管理员使用）
     * 对应XML文件中的selectAdminContentList
     *
     * @param page 分页参数
     * @param userId 用户ID筛选，可选
     * @param title 标题筛选（模糊匹配），可选
     * @param textContent 内容筛选（模糊匹配），可选
     * @param contentType 内容类型筛选，可选
     * @param orderBy 排序方式（created_at 或 like_count）
     * @return 分页内容列表
     */
    IPage<ContentListItemDTO> selectAdminContentList(Page<ContentListItemDTO> page,
                                                     @Param("userId") Long userId,
                                                     @Param("title") String title,
                                                     @Param("textContent") String textContent,
                                                     @Param("contentType") String contentType,
                                                     @Param("orderBy") String orderBy);

    /**
     * 分页查询公开内容列表（用户查看所有公开内容）
     * 对应XML文件中的selectPublicContentList
     *
     * @param page 分页参数
     * @param userId 用户ID筛选，可选
     * @param title 标题筛选（模糊匹配），可选
     * @param textContent 内容筛选（模糊匹配），可选
     * @param contentType 内容类型筛选，可选
     * @param orderBy 排序方式（created_at 或 like_count）
     * @return 分页内容列表
     */
    IPage<ContentListItemDTO> selectPublicContentList(Page<ContentListItemDTO> page,
                                                      @Param("userId") Long userId,
                                                      @Param("title") String title,
                                                      @Param("textContent") String textContent,
                                                      @Param("contentType") String contentType,
                                                      @Param("orderBy") String orderBy);

    /**
     * 更新内容的标题和文本内容
     *
     * @param contentId 内容ID
     * @param title 新标题
     * @param textContent 新文本内容
     * @return 更新的记录数
     */
    @Update("UPDATE contents SET title = #{title}, text_content = #{textContent}, updated_at = NOW() " +
            "WHERE id = #{contentId}")
    int updateContentText(@Param("contentId") Long contentId,
                          @Param("title") String title,
                          @Param("textContent") String textContent);

    /**
     * 更新内容发布状态
     *
     * @param contentId 内容ID
     * @param isPublished 发布状态
     * @return 更新的记录数
     */
    @Update("UPDATE contents SET is_published = #{isPublished}, updated_at = NOW() " +
            "WHERE id = #{contentId}")
    int updatePublishStatus(@Param("contentId") Long contentId,
                            @Param("isPublished") Boolean isPublished);


    /**
     * 条件更新内容上传状态（乐观锁机制）
     * 只有当前上传状态在允许的状态列表中时才会执行更新操作
     *
     * @param contentId 内容ID
     * @param allowedStatuses 允许更新的当前状态列表，只有内容的当前upload_status在此列表中才会被更新
     * @param newStatus 新的上传状态
     * @return 更新的记录数，如果当前状态不在允许列表中则返回0
     */
    int updateStatusIfAllowed(@Param("contentId") Long contentId,
                              @Param("allowedStatuses") List<String> allowedStatuses,
                              @Param("newStatus") String newStatus);
}